package TankGame;

// 该类是所有坦克的基类
// 包括了坦克的位置、移动速度、方向、血量等属性，以及移动、绘制、射击、按键处理等方法。
// 是游戏中坦克相关操作的基础类，体现了面向对象编程中的封装和抽象。

import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.List;
import java.io.Serializable;

// Tank类是游戏中坦克的基类，具有位置、速度、方向等属性，以及移动、绘制、射击和按键处理等方法
public class Tank implements Serializable {
    int x, y; // 坦克在游戏面板中的坐标
    int speed = 10; // 坦克的移动速度
    boolean up, down, left, right; // 表示坦克上下左右移动的方向标志位
    double angle = 0; // 坦克的射击角度
    private int health = 100; // 坦克的血量

    // 构造函数，用于初始化坦克的位置
    public Tank(int startX, int startY) {
        this.x = startX;
        this.y = startY;
    }

    // 移动坦克的方法，根据方向标志位和游戏边界、障碍物、敌方坦克的位置来更新坦克的坐标
    public void move(List<Obstacle> obstacles, List<EnemyTank> enemyTanks, int gameWidth, int gameHeight) {
        int newX = x;
        int newY = y;

        if (up && y > 0) newY -= speed;
        if (down && y < gameHeight - 50) newY += speed;
        if (left && x > 0) newX -= speed;
        if (right && x < gameWidth - 50) newX += speed;

        // 检查新位置是否与障碍物相交
        boolean canMove = true;
        for (Obstacle obstacle : obstacles) {
            if (new Rectangle(newX, newY, 50, 50).intersects(obstacle.getBounds())) {
                canMove = false;
                break;
            }
        }

        // 检查新位置是否与敌方坦克相交
        for (EnemyTank enemyTank : enemyTanks) {
            if (new Rectangle(newX, newY, 50, 50).intersects(enemyTank.getBounds())) {
                canMove = false;
                break;
            }
        }

        // 检查新位置是否超出游戏边界
        if (newX < 0 || newX > gameWidth - 60 || newY < 0 || newY > gameHeight - 50) {
            canMove = false;
        }

        if (canMove) {
            x = newX;
            y = newY;
        }
    }

    // 在给定的Graphics2D对象上绘制坦克，以蓝色圆形表示坦克和绿色矩形表示血量条
    public void draw(Graphics2D g) {
        g.setColor(Color.BLUE);
        g.fillOval(x, y, 50, 50);

        // 绘制血量条
        g.setColor(Color.GREEN);
        g.fillRect(x, y - 10, (int) (50 * ((double) health / 100)), 5);
        g.setColor(Color.BLACK);
        g.drawRect(x, y - 10, 50, 5);
    }

    // 坦克受到伤害时调用此方法，减少其血量
    public void takeDamage(int damage) {
        health -= damage;
    }

    // 判断坦克是否被摧毁，即血量是否小于等于0
    public boolean isDestroyed() {
        return health <= 0;
    }

    // 处理键盘按下事件，根据按下的键设置坦克的方向标志位和射击角度
    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
            case KeyEvent.VK_UP:
                up = true;
                angle = Math.PI / 2;
                break;
            case KeyEvent.VK_DOWN:
                down = true;
                angle = 3 * Math.PI / 2;
                break;
            case KeyEvent.VK_LEFT:
                left = true;
                angle = Math.PI;
                break;
            case KeyEvent.VK_RIGHT:
                right = true;
                angle = 0;
                break;
        }
    }

    // 处理键盘释放事件，根据释放的键重置坦克的方向标志位
    public void keyReleased(KeyEvent e) {
        switch (e.getKeyCode()) {
            case KeyEvent.VK_UP:
                up = false;
                break;
            case KeyEvent.VK_DOWN:
                down = false;
                break;
            case KeyEvent.VK_LEFT:
                left = false;
                break;
            case KeyEvent.VK_RIGHT:
                right = false;
                break;
        }
    }

    // 坦克射击的方法，创建并返回一颗子弹
    public Bullet shoot() {
        return new Bullet(x + 25, y + 25, angle, true);
    }

    // 获取坦克的矩形边界，用于碰撞检测
    public Rectangle getBounds() {
        return new Rectangle(x, y, 50, 50);
    }

    // 获取坦克的x坐标
    public int getX() {
        return x;
    }

    // 获取坦克的y坐标
    public int getY() {
        return y;
    }

    public int getHealth() {
        return health;
    }

    public void setHealth(int i) {
        health = i;
    }
}
